package com.the_ring.chapter15;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.webkit.GeolocationPermissions;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.Toast;

public class WebBrowserActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText webUrlEt;      // 输入网址的编辑框
    private WebView webView;        // 网页视图对象
    private ProgressDialog dialog;  // 进度对话框对象
    private String url;             // 网页地址

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_browser);

        webUrlEt = findViewById(R.id.et_web_url);
        webUrlEt.setText("xw.qq.com/");

        webView = findViewById(R.id.wv_web);
        findViewById(R.id.btn_web_go).setOnClickListener(this);
        findViewById(R.id.ib_back).setOnClickListener(this);
        findViewById(R.id.ib_refresh).setOnClickListener(this);
        findViewById(R.id.ib_forward).setOnClickListener(this);
        findViewById(R.id.ib_close).setOnClickListener(this);
        initWebViewSettings();
    }

    // 初始化网页视图的网页设置
    private void initWebViewSettings() {
        // 获取网页视图的网页设置
        WebSettings settings = webView.getSettings();
        // 设置是否自动加载图片
        settings.setLoadsImagesAutomatically(true);
        // 设置默认的文本编码格式
        settings.setDefaultTextEncodingName("utf-8");
        // 设置是否支持 JavaScript
        settings.setJavaScriptEnabled(true);
        // 设置是否允许 JavaScript 自动打开新窗口 window.open
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        // 设置是否支持缩放
        settings.setSupportZoom(true);
        // 设置是否出现缩放工具
        settings.setBuiltInZoomControls(true);
        // 设置超过页面大小时，是否放大页面到容器大小
        settings.setUseWideViewPort(true);
        // 设置页面超过容器大小时，是否缩小页面到容器大小
        settings.setLoadWithOverviewMode(true);
        // 设置自适应屏幕，Android 4.2.2 及之前的版本在自适应时可能会出现表格错乱的情况
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.btn_web_go) {
            // 从系统服务获取输入法管理器
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            // 关闭输入法软键盘
            imm.hideSoftInputFromWindow(webUrlEt.getWindowToken(), 0);
            url = "https://" + webUrlEt.getText().toString();
            // 命令网页视图加载指定路径的网页
            webView.loadUrl(url);
            // 设置自定义的网页浏览器客户端
            webView.setWebViewClient(webViewClient);
            // 设置自定义的网页交互客户端
            webView.setWebChromeClient(webChromeClient);
        } else if (id == R.id.ib_back) {
            if (webView.canGoBack()) {
                webView.goBack();
            } else {
                Toast.makeText(this, "已经时最后一页了", Toast.LENGTH_SHORT).show();
            }
        } else if (id == R.id.ib_forward) {
            if (webView.canGoForward()) {
                webView.goForward();
            } else {
                Toast.makeText(this, "已经时最后前一页了", Toast.LENGTH_SHORT).show();
            }
        } else if (id == R.id.ib_refresh) {
            webView.reload();
        } else if (id == R.id.ib_close) {
            finish();
        }
    }

    // 按下返回键触发
    @Override
    public void onBackPressed() {
        if (webView.canGoBack() && !webView.getUrl().equals(url)) {
            webView.goBack();
        } else {
            finish();
        }
    }

    // 网页浏览器客户端
    private WebViewClient webViewClient = new WebViewClient() {
        // 收到 SSL 错误时触发
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();
        }

        // 页面开始加载
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            if (dialog == null || !dialog.isShowing()) {
                // 弹出提示网页正在加载
                dialog = new ProgressDialog(WebBrowserActivity.this);
                dialog.setTitle("稍等");
                dialog.setMessage("页面加载中……");
                dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                dialog.show();
            }
        }

        // 页面加载结束
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (dialog != null && dialog.isShowing()) {
                dialog.dismiss();
            }
        }

        // 收到错误信息
        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
            if (dialog != null && dialog.isShowing()) {
                dialog.dismiss();
            }
            Toast.makeText(WebBrowserActivity.this, "页面加载失败，请稍候再试", Toast.LENGTH_SHORT).show();
        }

        // 发生网页跳转
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);  // 在当前的网页试图内部跳转
            return true;
        }
    };


    // 网页交互客户端
    private WebChromeClient webChromeClient = new WebChromeClient() {
        // 页面加载进度发生变化时触发
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            if (dialog != null && dialog.isShowing()) {
                dialog.setProgress(newProgress);
            }
        }

        // 网页请求定位权限
        @Override
        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
            // 不弹窗就允许网页获得定位权限
            callback.invoke(origin, true, false);
            super.onGeolocationPermissionsShowPrompt(origin, callback);
        }
    };
}